package sma.organizations.roles;

import javax.vecmath.Vector2d;
import org.janusproject.kernel.agentmemory.Memory;
import org.janusproject.kernel.crio.core.Role;
import org.janusproject.kernel.message.Message;
import org.janusproject.kernel.status.Status;
import org.janusproject.kernel.status.StatusFactory;
import sma.agents.bodies.CircleBody;
import sma.environment.LocalEnvironment;
import sma.organizations.messages.GoalMessage;
import sma.organizations.messages.RepulsiveMessage;
import sma.organizations.signals.SendMoveSignal;
import appli.utils.Config;

/**
 * TODO : vérifier l'utilité de cette classe
 * Repulsive est le rôle tenu par un Obstacle dans l'organization Environment
 * Ces agents se contentent "d'être"
 * 
 * Depuis la version 0.3 nous prenons en compte le groupe de l'agent. 
 * 
 * @author Etienne Sainton
 * @version 0.3
 * @version 0.1
 */
public class Repulsive extends Role {


	/**
	 * 
	 * Son body
	 * 
	 */
	private sma.agents.bodies.CircleBody body;
	
	/**
	 * Le groupe de l'agent
	 */
	private int groupe;

	/**
	 * Cette inner class Enum, eprmet de lister les états de la vie de l'agent.
	 * Il y'en a 1 : I_M_HERE
	 * @author Etienne Sainton
	 * @since 0.1
	 */
	public enum State {
		/**
		 * Envoie de sa position a la GUI
		 */
		INIT,
		/**
		 * Envoie de sa position aux agents
		 */
		I_M_HERE
		;
	}

	/**
	 * 
	 * L'etat courant de l'agent
	 * 
	 */
	private Repulsive.State currentState = State.INIT;

	/**
	 * Initialisation de l'agent. Automatiquement appelee par le constructeur
	 * 
	 * @param _body la représentation graphique de l'agent
	 */
	private void init(Integer _id, CircleBody _body, boolean _polaire, int _groupe) {
		
		this.body = _body;
		this.groupe = _groupe;
		
		
	}

	/**
	 * Override de l'activate defini par Janus. Nous en profitons pour lui
	 * affecter son environnement et son body.
	 */
	@Override
	public Status activate(Object... params) {
		init((Integer) params[0], (CircleBody) params[1], (Boolean) params[2], (Integer) params[3]);

		if (Config.DEBUG == true)
			System.out.println("Le role Repulsif est initialisé");

		return StatusFactory.ok(this);
	}

	/**
	 * Override du live defini par Janus. Le raisonnement est le suivant : 
	 * j'informe les agents décisionnels de ma position
	 * je ne fais rien jusqu'à ce que je meurs
	 * 
	 */
	@Override
	public Status live() {
		run();
		return StatusFactory.ok(this);
	}
	
	@Override
	public Status end(){
		super.end();
		
		broadcastMessage(Decisive.class,new RepulsiveMessage(0, this.groupe,this.body.getPosition(),false));
		
		return StatusFactory.ok(this);
	}

	
	private void run() {
		switch (this.currentState) {
		case INIT:
			fireSignal(new SendMoveSignal(this));
			// J'envoie ma position à tout le monde :D
			broadcastMessage(Decisive.class, new RepulsiveMessage(0, this.groupe,this.body.getPosition()));
			
			this.currentState = State.I_M_HERE;
		break;
		case I_M_HERE:
				this.currentState = State.I_M_HERE;
				for (Message msg : getMailbox())
					sendMessage(Decisive.class, msg.getSender(), new RepulsiveMessage(0, this.groupe,
							this.body.getPosition()));
		break;
		}
	}
}
